#ifndef _SYSTEMCALL_H
#define _SYSTEMCALL_H

/* 定义系统调用的软中断号 */
#define	__NR_sys_print				(0)
#define	__NR_sys_exit				(1)
#define	__NR_sys_fork				(2)
#define	__NR_sys_read				(3)
#define	__NR_sys_write				(4)
#define	__NR_sys_open				(5)
#define	__NR_sys_close				(6)
/* 系统中允许的最多系统调用数 */
#define	__NR_sys_call				(7)

/* 定义系统调用的函数指针 */
typedef int (*syscall_fn_ptr)();

/* 下面涉及到内联汇编的语法 
 * do-while是为了保证宏被展开后还是一个整体，不发生错误，比如在if后面使用。
 * 在宏定义内联汇编中每行都需要换行符，也不能添加注释；在内联汇编中不需要换行符，可以随意添加注释
 * 说明：依次先将parray,pnum压栈，然后调整栈位置，最后利用num作为参数实现软中断；
 * 返回时，将返回值赋值给ret,然后调整栈位置
 * 注意：分行符后面不要有空格
 */
#define SYSCALL(num,pnum,parray,ret)    \
do{                         			\
	asm volatile(                       \
	"stmfd r13!,{%3}\n"					\
	"stmfd r13!,{%2}\n"					\
	"sub r13,r13,#4\n"					\
	"swi %1\n"							\
	"ldmfd r13!,{%0}\n"					\
	"add r13,r13,#8\n"					\
	:"=r"(ret)                          \
	:"i"(num),"r"(pnum),"r"(parray)     \
	:"r2","r3"							\
	);                                  \
}while(0)

#endif

